์ž‘์„ฑ: 2026-03-04 02:23:35์ˆ˜์ •: 2026-03-04 02:23:35

Java Swing ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ: ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ์ดํ•ดํ•˜๊ธฐ

์ž๋ฐ” ์Šค์œ™(Java Swing) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๋“ฑ ์‚ฌ์šฉ์ž์˜ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(Event Listener) ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. 2026๋…„ ๊ธฐ์ค€ ํ˜„๋Œ€์ ์ธ ์ž๋ฐ” ๋ฌธ๋ฒ•(๋žŒ๋‹ค์‹ ๋“ฑ)์„ ํ™œ์šฉํ•œ ํšจ์œจ์ ์ธ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ชจ๋ธ์˜ ๊ตฌ์กฐ

์Šค์œ™์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋Š” '๋ฐœ์ƒ์ง€(Source)', '์ด๋ฒคํŠธ ๊ฐ์ฒด(Event Object)', **'๋ฆฌ์Šค๋„ˆ(Listener)'**์˜ ์„ธ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  1. Source: ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ (์˜ˆ: JButton)
  2. Event Object: ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด (์˜ˆ: ActionEvent)
  3. Listener: ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ฐœ์ƒ ์‹œ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค (์˜ˆ: ActionListener)

2. ์ฃผ์š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

โ‘  ๋ฒ„ํŠผ ํด๋ฆญ ์ฒ˜๋ฆฌ (ActionListener)

๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์ผ์ง€๋งŒ, ํ˜„์žฌ๋Š” ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

JButton button = new JButton("ํด๋ฆญํ•˜์„ธ์š”");
 
// ๋žŒ๋‹ค์‹์„ ์ด์šฉํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
button.addActionListener(e -> {
    System.out.println("๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");
    JOptionPane.showMessageDialog(null, "์•ˆ๋…•ํ•˜์„ธ์š”!");
});

โ‘ก ๋งˆ์šฐ์Šค ๋ฐ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ

ํŠน์ • ์ปดํฌ๋„ŒํŠธ ์œ„๋กœ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ํ‚ค๋ณด๋“œ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋Š” ๋™์ž‘์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • MouseListener: mouseClicked, mouseEntered, mouseExited ๋“ฑ ์ฒ˜๋ฆฌ.
  • KeyListener: keyPressed, keyReleased ๋“ฑ ์ฒ˜๋ฆฌ.

Tip: ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋ฉด MouseAdapter๋‚˜ KeyAdapter๋ฅผ ์ƒ์†๋ฐ›์•„ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3. ์ค‘์š”: ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์‹œ ์ฃผ์˜์‚ฌํ•ญ (EDT์™€ ์Šค๋ ˆ๋“œ)

์ง€๋‚œ ๊ธ€์—์„œ ๊ฐ•์กฐํ–ˆ๋“ฏ, ์Šค์œ™์€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋Š” **EDT(Event Dispatch Thread)**์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  • ๊ธˆ์ง€ ์‚ฌํ•ญ: ๋ฆฌ์Šค๋„ˆ ๋‚ด๋ถ€์—์„œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ฝ๊ธฐ ๋“ฑ '๋ฌด๊ฑฐ์šด ์ž‘์—…'์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ™”๋ฉด์ด ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์€ SwingWorker ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•œ ๋’ค, UI ์—…๋ฐ์ดํŠธ๋งŒ ๋‹ค์‹œ SwingUtilities.invokeLater()๋กœ ๋„˜๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
button.addActionListener(e -> {
    new Thread(() -> {
        // 1. ๋ฌด๊ฑฐ์šด ์ž‘์—… ์ˆ˜ํ–‰ (์˜ˆ: DB ์กฐํšŒ)
        String data = fetchDataFromDB(); 
        
        // 2. UI ์—…๋ฐ์ดํŠธ๋Š” ๋‹ค์‹œ EDT์—์„œ ์‹คํ–‰
        SwingUtilities.invokeLater(() -> {
            label.setText(data);
        });
    }).start();
});

4. ์š”์•ฝ

  • ๊ฐ„๋‹จํ•œ ์•ก์…˜์€ ๋žŒ๋‹ค์‹๊ณผ ActionListener๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณต์žกํ•œ ๋งˆ์šฐ์Šค/ํ‚ค๋ณด๋“œ ๋™์ž‘์€ Adapter ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด ๋ฌด๊ฑฐ์šด ์ž‘์—…์€ ๋ฐ˜๋“œ์‹œ ๋ณ„๋„ ์Šค๋ ˆ๋“œ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ์ •์ ์ธ UI์— ์ƒ๋ช…๋ ฅ์„ ๋ถˆ์–ด๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.